/// 所谓库级别指的是编写为可被其它库或者应用复用的代码。
/// 因此，并不清楚错误最终会被如何处理，
/// 所以最终会在库级别统一Error的类型，并最终将底层转译到该错误类
/// thiserror会为MyError自动实现底层Error的From trait。
/// 所以在fetch_id中就可以直接用?操作符将底层 Error映射到MyError
#[derive(thiserror::Error, Debug)]
pub enum MyError {
    #[error("io error.")]
    IoError(#[from] std::io::Error),
    #[error("parse error.")]
    ParseError(#[from] std::num::ParseIntError),
}

pub type Result<T> = std::result::Result<T, MyError>;

pub fn fetch_id() -> Result<u64> {
    let content = std::fs::read_to_string("/tmp/tmp_id")?;
    let id = content.parse::<u64>()?;
    Ok(id)
}